#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#define NUM 1024
#define SIZE 32
#define SEP " "
char cmd_line[NUM];
char* g_argv[SIZE];
int main(){

    while(1){
        // 1. 打印提示信息：
        printf("[Mortal[myshell.exe]@VM-12-16-centos linux]$ ");
        fflush(stdout);     // 刷新缓冲区！如果没有这句话直接运行，不会出现上一行的打印内容！
        // 2. 获取用户输入：各种指令和选项
        memset(cmd_line, '\0' ,sizeof(cmd_line));
        if(fgets(cmd_line, sizeof(cmd_line),stdin)==NULL){
            continue;
        }
        cmd_line[strlen(cmd_line)-1] = '\0';
        // printf("echo：%s\n",cmd_line);
        
        // 3. 命令行字符串解析！
        // 使用 C 语言接口
        g_argv[0] = strtok(cmd_line, SEP);  // 第一次解析必须传递原串
        
        int idx = 1;

        // 加入颜色标记和ll指令
        if(strcmp(g_argv[0], "ls")==0){
            g_argv[idx++] = "--color=auto";
        }
        if(strcmp(g_argv[0], "ll") == 0){
            g_argv[0] = "ls";
            g_argv[idx++] = "-l";
            g_argv[idx++] = "--color=auto";
        }
        while(g_argv[idx++] = strtok(NULL, SEP));// 如果是继续解析，第二次直接传递NULL
        //for(idx = 0;g_argv[idx];idx++){
        //    printf("argv[%d] : %s\n",idx, g_argv[idx]);
        //}

        // 4. 优化 cd 等命令问题
        if(strcmp(g_argv[0], "cd") == 0){
            if(g_argv[1] != NULL) chdir(g_argv[1]);
            continue;
        }
        

        // 5. fork()
        pid_t id = fork();
        if(id == 0){
            printf("下面功能让子进程执行！\n");
            execvp(g_argv[0],g_argv);
            exit(1);
        }
        int status = 0;
        pid_t ret = waitpid(id, &status, 0);    // 阻塞式等待
        if(ret > 0){
            printf("exit code : %d\n",WEXITSTATUS(status));
        }
        
    }

    return 0;
}
